/**
 * Copyright &copy; 2021-2026
 */
package org.dylan.common.base.dto;

import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.Lists;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.List;

/**
 * 树形结构基类
 *
 * @author Dylan
 * @since 2024-10-24
 */
@Data
@EqualsAndHashCode(callSuper = false)
public abstract class TreeDTO<T> extends BaseDTO<T> {

    private static final long serialVersionUID = 1L;

    /**
     * 父级元素
     */
    protected T parent;

    /**
     * 子元素
     */
    private List<T> children = Lists.newArrayList();

    /**
     * 所有父级编号
     */
    protected String parentIds;

    /**
     * 排序
     */
    protected Integer sort;

    /**
     * 构造函数
     */
    public TreeDTO() {
        super();
    }

    /**
     * 构造函数
     *
     * @param id 数据唯一标识
     */
    public TreeDTO(String id) {
        super(id);
    }

    /**
     * 获取上级id
     *
     * @return 上级id
     */
    public String getParentId() {
        String id = null;
        if (parent != null) {
            id = (String) ReflectUtil.getFieldValue(parent, "id");
        }
        return StrUtil.isNotBlank(id) ? id : getRootId();
    }

    /**
     * 默认根节点
     *
     * @return 默认根节点标识
     */
    @JsonIgnore
    public static String getRootId() {
        return "0";
    }
}
